import sys
import os
import datetime

from bson import ObjectId
# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 将包含 Utils 文件夹的父目录添加到 Python 的搜索路径
utils_parent_dir = os.path.join(current_dir, '..', 'Utils')
sys.path.append(utils_parent_dir)

from BaseMongoDao import *

class SensorDateDAO(BaseMongoDAO):
    def __init__(self):
        super().__init__("sensor")  

    def get_rencent_data(self, days = 3):
        n_days_ago = datetime.datetime.now() - datetime.timedelta(days= days)
        # 从 MongoDB 中获取近三天内的数据
        res = list(self.fetch_all({"time": {"$gte": n_days_ago}}))

        # 开始数据处理
        if not res:
            return {"error": "No data found"}

        # 初始化最大湿度值及对应的设备名称
        max_humidity = -1
        max_humidity_device = None

        return res 

    def get_current_data(self):
        data = self.fetch_one()
        for k,v in data.items() :
            if(k == "_id"):
                data[k] = str(v)
        return data 

    def process_data(self , data):
        if isinstance(data, dict):
            for key, value in data.items():
                if isinstance(value, ObjectId):
                    data[key] = str(value)
                elif isinstance(value, list) or isinstance(value, dict):
                    data[key] = self.process_data(value)
        elif isinstance(data, list):
            for i, item in enumerate(data):
                if isinstance(item, ObjectId):
                    data[i] = str(item)
                elif isinstance(item, list) or isinstance(item, dict):
                    data[i] = self.process_data(item)
        return data
    
    def get_data_by_time(self, time_str):  
        # 将时间字符串转换为datetime对象  
        target_time = datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')  
  
        # 查找最接近目标时间的数据  
        pipeline = [  
            {  
                "$addFields": {  
                    # 如果time是字符串，您可能需要先将其转换为日期时间  
                    # "time": {"$toDate": "$time"}  # 取消注释如果time是字符串  
                    "time_diff": {"$abs": {"$subtract": ["$time", target_time]}}  
                }  
            },  
            {  
                "$sort": {  
                    "time_diff": 1  # 按时间差排序，1为升序，即最接近的在前  
                }  
            },  
            {  
                "$limit": 1  # 只取最接近的一个  
            },  
            {  
                "$project": {  
                    "time_diff": 0  # 移除时间差字段，如果不需要的话  
                }  
            }  
        ]  
  
        # 注意：这里我们直接对集合使用aggregate方法，而不是self.connect_client（它可能不存在或不是预期的集合）  
        data = list(self.connect_client.aggregate(pipeline))  # 请替换 'db' 和 'collection' 为您实际的数据库和集合名称

        if data:  
            # 将_id转换为字符串（如果需要）  
            if '_id' in data[0]:  
                data[0]['_id'] = str(data[0]['_id'])  
            return data[0]  
        else:  
            return None 
    # 可以添加特定于sensor集合的方法
   
    def get_last_day_data(self):
        now = datetime.now()
        # 计算三天前的时间
        three_days_ago = now - timedelta(days=3)

        # 构建查询条件
        query = {'time': {'$gte': three_days_ago}}  # $gte 表示大于或等于

        # 执行查询
        results = self.fetch_all(query)
        return  self.process_data(results)

class SensorDirectionDateDAO(BaseMongoDAO):
    def __init__(self):
        super().__init__("sensor_dirction")  # 假设操作的集合名为 "users"

    # 可以添加特定于sensor集合的方法



if __name__ == '__main__':
    """简单的脚本测试"""
    dao = SensorDateDAO()
    dao.get_rencent_data()
